package exprarbre;

import java.util.HashMap;

/**
 * Arbre de Syntaxe Abstraite pour une expression.
 *
 * @author Cédric Hulin
 */
public abstract class ASAExpr {

    /**
     * Obtention du fils de gauche
     *
     * @return le fils de gauche
     */
    public ASAExpr getExpr1() {
        return null;
    }

    /**
     * Obtention du fils de droite
     *
     * @return le fils de droite
     */
    public ASAExpr getExpr2() {
        return null;
    }

    /**
     * Retourne la valeur de l'expression
     *
     * @return
     */
    public Integer getValeur() {
        return -1;
    }

    /**
     * Obtention du nom de l'expression
     *
     * @return nom de l'expression
     */
    public String getLabelExplorateur() {
        return this.getClass().getSimpleName().substring(3);
    }

    public String notationExplorateur() {
        return notationExplorateur("");
    }

    /**
     * Calcule la notation explorateur.
     *
     * @param prefixe
     * @return
     */
    private String notationExplorateur(String prefixe) {
        String res = prefixe + getLabelExplorateur() + "\n";
        String prefixeSuiv = prefixe + "  ";
        ASAExpr e1 = getExpr1();
        ASAExpr e2 = getExpr2();
        if (e1 != null) {
            res += e1.notationExplorateur(prefixeSuiv);
        }
        if (e2 != null) {
            res += e2.notationExplorateur(prefixeSuiv);
        }
        return res;
    }

    protected void setPointeur(HashMap<String, Integer> affectation) {
        if (getExpr1() != null) {
            getExpr1().setPointeur(affectation);
        }
        if (getExpr2() != null) {
            getExpr2().setPointeur(affectation);
        }
    }

    public int evalue(HashMap<String, Integer> affectation) {
        setPointeur(affectation);
        return evalue();
    }

    public void semantique() {
    }

    protected abstract int evalue();

    public ASAExpr simplifie() {
        return this;
    }
}